package miscelaneos;

import java.util.Vector;

import javax.swing.JOptionPane;

import myExceptions.JNegativeException;

public class JUtilities {
    
    public final float PI = (float)3.14159167;
    public final float raiz2 = 1.41421356F;
    
    //public const float myPI = 3.14159F;
    
    public JUtilities() {
    }

   
    // Todos los metodos en Java son polimorficos
    // Overload y overwrite
    public void MyMetodo() {
        JOptionPane.showMessageDialog(null, "Metodo de JUtilities");
    }
    
    public void MyMetodo(int a){
        int i = 1;
        while(i <= a){
            System.out.println("Iteracion: " + i);
            
            if (i % 5 == 0)
                System.out.println("-----------");

            if (i >= 30)
                break;

            i++;
        }
    }
    
    public static void Pares(int a, int b){
        for(int i = a; i<= b; i++){
            if (i%2 != 0) continue;
            System.out.println("Numero Par: " + i);
        }
    }
    
    public static void Primos(int a, int b){
        //Imprimir todos los numeros primos contenidos entre a y b
        //PD: Un numero primo es aquel solo solo es divisible entre si mismo
        //y la unidad
        //Ejemplos: 1, 2, 3, 5, 7, 11, 13, etc
        //El numero 4 no es primo porque es divisible entre 1, 2, 4
        
        for(int i=a; i<= b; i++){
            if (JUtilities.esPrimo(i))
                System.out.print(i + "\t");
            
        }
        
    }
    
    public static boolean esPrimo(int x){
        int i = 1, divisores = 0;
        
        //hardcodeando el resultando cuando x = 1
        if ( x == 1 ) return true;
        
        for(i = 1; i<= x; i++){
            if (x % i == 0)
                divisores ++;
        }
        
        if (divisores == 2 ) 
            return true;
        else 
            return false;
    }
    
    public void MyMetodo(float n){ }
    
    public static void fibonacci(int n) throws Exception {
        int a = 0, b = 1;
        int nextNumber;
        
        if (n < 0) {
            throw new Exception ("El numero de digitos fibonnaci debe ser mayor a 0");
        }
        
        if (n >= 1)
            System.out.print(a + "\t");
           
        if (n >= 2)
            System.out.print(b + "\t");
        
        for(int i = 3; i<= n; i++){
            nextNumber = a + b;
            System.out.print(nextNumber + "\t");
            a = b;
            b = nextNumber;
        }
    }

    //Este metodo ya no es polimorfimo
    public final void MyMetodo2(){
        JOptionPane.showMessageDialog(null, "Metod2 de JUtilities");
    }
    
    public static void main(String args[]){
        JUtilities j = new JUtilities();
        
        //j.MyMetodo(100);
        //JUtilities.Primos(100, 200);
        //System.out.println();
        //JUtilities.Primos(1, 10);
        
        int intN;
        String strN;
        
        strN = JOptionPane.showInputDialog(null, "Ingrese el numero de \n" +
                                                 "elementos de la serie de \n" +
                                                 "fibonnaci que desea que se muestren");
        
        if (strN == null || strN.equals("")){
            JOptionPane.showMessageDialog(null, "Debe ingresar un numero > 0");
            return;
        }
            
        intN = Integer.parseInt(strN);
        
        try {
            JUtilities.fibonacci(intN);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", 
                JOptionPane.ERROR_MESSAGE);
        }finally{
            //Este bloque de codigo se ejecutara suceda o no la exception
            //JOptionPane.showMessageDialog(null, "Seccion Finally");
            
            //Al asignar null a la(s) variable(s) que referencien al objeto
            //este se libera
             j = null;
             
             // Invoco al recolector de basura para limpiar los objetos que no
             // estan referenciados
             System.gc();
            
        }
    }

    public static int getInt(String strMensaje) {
        int intReturn;
        String strReturn;
        
        strReturn = JOptionPane.showInputDialog(null, strMensaje);
        
        intReturn = Integer.parseInt(strReturn);
        
        return intReturn;
    }

    public static void BubbleSorted(int[] intValor) {
        int i, j, swp;
        
        for(i = 0; i < intValor.length; i++){
            for(j = i; j < intValor.length; j++){
                if (intValor[i] > intValor[j]){
                    swp = intValor[i];
                    intValor[i] = intValor[j];
                    intValor[j] = swp;
                }
            }
        }
    }

    public static void PrintArray(int[] intValor) {
        for(int i = 0; i< intValor.length; i++){
            System.out.print(intValor[i] + "\t");
        }
        System.out.println();
    }

    public static void InitialiteArray(int[] intValor) {
        for(int i = 0; i< intValor.length; i++){
            intValor[i] = JUtilities.getInt("Ingrese el elemento " + (i+1));
        }    
    }

    public static int [] ReDimArray(int[] intValor, int intNewLong) {
        int intRedim[] = new int[intNewLong];
        
        for(int i= 0; i < intRedim.length; i++){
            if (i < intValor.length)
                intRedim[i] = intValor[i];
        }
        return intRedim;
        
    }

    public static void PrintArray(Vector objArray) {
    
        //For para colecciones
        for(Object objItem : objArray){
            System.out.print(objItem + "\t");
        }
        System.out.println();
    }

    public static String getString(String strMensaje) {
        String strReturn;
        
        strReturn = JOptionPane.showInputDialog(null, strMensaje);
        
        return strReturn;
    }

    public static void showMessageError(String strMensaje) {
        JOptionPane.showMessageDialog(null, strMensaje, "Error de aplicaion", 
                                        JOptionPane.ERROR_MESSAGE);
    }

    public static Integer getOnlyPositiveInt(String strMensaje) throws JNegativeException {
        int intReturn;
        String strReturn;
        
        strReturn = JOptionPane.showInputDialog(null, strMensaje);
        
        try{
            intReturn = Integer.parseInt(strReturn);
        }catch(NumberFormatException ex){
            JUtilities.showMessageError("Error, la cadena no es numerica");
            intReturn = 0;
        }
        
        if (intReturn < 0 )
            throw new JNegativeException("El numero ingresado no es positivo");
        
        return intReturn;
    }

    public static void showMessageInformacion(String string) {
        JOptionPane.showMessageDialog(null, string, "Mensaje Informativo", 
                                        JOptionPane.INFORMATION_MESSAGE);
    }
}
